package com.example.test.springdemo.common;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 　　　　　　　   ┏┓              ┏┓+ +
 * 　　　　　　　┏┛┻━━━━━━━┛┻┓ + +
 * 　　　　　 　┃　　　　　　         ┃
 * 　　　　　　┃　　　   ━　　　    ┃ ++ + + +
 * 　　　　　 █████━█████ ┃+
 * 　　　　　┃　　　　　　         ┃ +
 * 　　　　 ┃　　　   ┻　　　    ┃
 * 　　　　┃　　　　　　         ┃ + +
 * 　　　 ┗━━┓　　　     ┏━┛
 * ┃　　      ┃
 * 　　　　　　┃　　      ┃ + + + +
 * 　　　　 　┃　　　    ┃　Code is far away from     bug with the animal protecting
 * 　　　　　┃　　　    ┃ + 　　　　         神兽保佑,代码无bug
 * 　　　　 ┃　　　    ┃
 * 　　　　┃　　　    ┃　　+
 * 　　　 ┃　 　      ┗━━━┓ + +
 * 　　　┃ 　　　　　        ┣┓
 * 　　 ┃ 　　　　　        ┏┛
 * 　　┗┓┓┏━━━┳┓ ┏┛ + + + +
 * 　　 ┃┫┫　     ┃┫┫
 * 　  ┗┻┛　     ┗┻┛+ + + +
 * 佛曰:
 * 写字楼里写字间，写字间里程序员；
 * 程序人员写程序，又拿程序换酒钱。
 * 酒醒只在网上坐，酒醉还来网下眠；
 * 酒醉酒醒日复日，网上网下年复年。
 * 但愿老死电脑间，不愿鞠躬老板前；
 * 奔驰宝马贵者趣，公交自行程序员。
 * 别人笑我忒疯癫，我笑自己命太贱；
 * 不见满街漂亮妹，哪个归得程序员？
 *
 * @author ：吉金武
 * @date ：Created in 2021/2/23
 * @version: V1.0
 * @slogan: 天下风云出我辈，一入代码岁月催
 * @description:
 **/
@ApiModel(value = "结果集返回对象")
@Data
public class Result<T> {

    @ApiModelProperty(value = "响应状态码",dataType = "Integer")
    private Integer code;

    @ApiModelProperty(value = "响应的消息提示",dataType = "String")
    private String message;

    @ApiModelProperty(value = "响应的数据")
    private T data;

    public Result(int code, String message, T data){
        this.code=code;
        this.message=message;
        this.data=data;
    }

    public Result() {

    }

    public Result(int code, String message) {
        this.code=code;
        this.message=message;
    }


    /**
     * 请求成功
     * @param <T>
     * @return
     */
    public static <T> Result<T> success(){
        return new Result<T>(Code.SUCCESS.code(),Code.SUCCESS.message(),null);
    }

    /**
     * 请求成功
     * @param <T>
     * @return
     */
    public static <T> Result<T> success(T data){
        return new Result<T>(Code.SUCCESS.code(),Code.SUCCESS.message(),data);
    }
    /**
     * 请求成功
     * @param data
     * @param <T>
     * @return
     */
    public static <T> Result<T> success(String message,T data){
        return new Result(Code.SUCCESS.code(),message,data);
    }

    public static <T> Result success(String message, T data, int code){
        return new Result(code, message, data);
    }

    public static <T> Result<T> success(String message){
        return new Result(Code.SUCCESS.code(),message);
    }

    /**
     * 请求失败
     * @param <T>
     * @param desc
     * @return
     */
    public static <T> Result<T> failure(String desc){
        return new Result<T>(Code.FAILURE.code(),desc,null);
    }

    public static <T> Result<T> failure(String message,T data){
        return new Result(Code.FAILURE.code(),message,data);
    }


    public static <T> Result<T> defaultResult(int code,String message){
        return new Result(code,message);
    }
}
